package com.ftg.learn.back.pattern.proxy;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.util.Arrays;

/**
 * @author kangjx
 * @createTime 2022/9/5
 */
public class Exam {


    public void dynamicProxy() {
        /**
         * 是在代码块当中，通过匿名内部的方式来完成当前的代理
         * Proxy 这是一个java.3的原始数据类型
         *  -- 可以能过当前类Proxy来动态的生产一个类的代理 类
         *  动态代理 。
         *  -- newProxyInstance 产生代理类
         *      -- ClassLoader loader,  类加载器
         *      -- interfaces           接口 null
         *      -- InvocationHandler    匿名内部处理类
         */
        Iteacher it2 = (Iteacher) Proxy.newProxyInstance(this.getClass().getClassLoader(),
                new Class[]{Iteacher.class},
                new InvocationHandler() {
                    @Override
                    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                        System.out.println("你现在要执行的方法是:" + method.getName());
                        System.out.println("方法的参数是:" + Arrays.toString(args));
                        System.out.println("代理对象:" + proxy.getClass().getSimpleName());

                        if (method.getName().equals("say")) {
                            System.out.println(" 先来一段音乐 music。。。。");
                            System.out.println(" 再来一段热舞 dancer 。。。。");
//                            System.out.println("华少 : 有请我们著名的网名讲师" + this.getTeaName() + "讲授课程为:" + this.getSubjectName());
                        } else if (method.getName().equals("getTeaName")) {
                            return "张三";
                        }

                        return null;
                    }
                }
        );
        System.out.println(it2.say());
        System.out.println(it2.getTeaName());

        Iteacher it3 = (Iteacher) Proxy.newProxyInstance(this.getClass().getClassLoader(),
                new Class[]{Iteacher.class}, (proxy, method, args) -> {

                    return null;
                });

    }

    public static void main(String[] args) {
        /**
         * 网红 ： 张三  张二狗
         * 先来一段音乐 再来一段热舞  。。。。
         * 主持人 ： 有请我们著名的网名讲师张三
         * (。。。。。。。。)
         * 。。。。。。。
         * 买它买它...
         */
//        Iteacher it = new Teacher("张三","golang....");
//        System.out.println(it.say());


        //工厂 -  代理吗...
//        iteacher - TeacherProxyFactory -- teacherproxy -- createTeacher() --- 注解 defaultval

//        Iteacher it1 = new TeacherProxy(new Teacher("王二狗","c++"));
//        System.out.println(it1.say());


        Exam e = new Exam();
        e.dynamicProxy();


    }

}
